package base.thread_demo.demo04;

public class Ticket implements Runnable{
    /*
     * 	多线程的安全问题通过synchronized同步代码块解
     */
    private int num=100;

    Object obj = new Object();

    @Override
    public void run() {
        while(true) {
            //synchronized同步代码块解决线程安全问题，即使t1、t2、t3、t4线程都走到这里，然后t1执行完num=99，然后切换到t2，t2会发现num=99，然后在99-1
            synchronized(obj) {
                if(num>0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"..."+num--);
                }else {
                    break;
                }
            }
        }
    }


    public static void main(String[] args) {
        Ticket t = new Ticket();
        Thread t1 = new Thread(t,"t1");
        Thread t2 = new Thread(t,"t2");
        Thread t3 = new Thread(t,"t3");
        Thread t4 = new Thread(t,"t4");

        //多个线程操作同一个对象数据(共享数据)，就有可能会出现问题，因此需要对共享数据加锁，让线程串行化处理,用空间换取时间（抢占CPU执行权达到提高程序性能）
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}
